package com.oldbook.manage.section;

import com.oldbook.common.annotation.CreditCheck;
import com.oldbook.common.core.domain.entity.SysUser;
import com.oldbook.common.exception.ServiceException;
import com.oldbook.common.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * @author DELL
 */
@Aspect
@Component
@Slf4j
public class CreditAspect {
    /**
     * 在方法执行前进行信用检查的切面方法
     *
     * @param creditCheck 信用检查注解对象，包含所需信用分阈值
     * @throws Throwable 当用户未登录或信用分不足时抛出异常
     *
     * 方法逻辑：
     * 1. 从安全上下文中获取当前登录用户
     * 2. 校验用户登录状态
     * 3. 比较用户信用分与要求的阈值
     * 4. 信用分不足时抛出业务异常
     */
    @Before("@annotation(creditCheck)")
    public void checkCredit(CreditCheck creditCheck) throws Throwable {
        // 获取当前登录用户信息
        SysUser sysUser = SecurityUtils.getLoginUser().getUser();
        log.info("用户诚信值：{}", sysUser.getCreditScore());

        // 用户登录状态检查
        if (sysUser == null) {
            throw new ServiceException("用户未登录");
        }

        // 信用分比对检查
        int creditScore = sysUser.getCreditScore();
        int requiredCredit = creditCheck.value();
        if (creditScore < requiredCredit) {
            throw new ServiceException("积分不足，无法进行操作");
        }
    }

}
